perm filename MUSPLA.FAI[IRC,LCS] blob
sn#273058 filedate 1977-03-30 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00004 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE SOUND DOROTHY BENDER MEMORIAL TITLE 1969,69,69, 1975(LCS)*******
C00006 00003 FIND OUT NUMBER OF CHANNELS AND THE SPEED.
C00013 00004 BEGIN MAIN BODY OF PROGRAM
C00018 ENDMK
C⊗;
TITLE SOUND; DOROTHY BENDER MEMORIAL TITLE 1969,69,69, 1975(LCS)*******
; ******CALL PLAY(NCHNS,SRATE)***** WHERE ARGUMENTS ARE BOTH INTEGER.
; ROUTINE TO READ THE OUTPUT FROM THE MUSIC
; PROGRAM AND CALL THE D-A CONVERTER TO PLAY.
;
; NAME OF THE FILE TO BE INPUTTED IS 'TEST.SND'
; THE FIRST RECORD OF WHICH CONTAINS THE
; NUMBER OF WORDS OF DATA IN THE ENTIRE DISK FILE.
; ALSO INCLUDES FUNCTION TO CHECK ON DATADISC - FOR DPYS.
ENTRY PLAY,NOTDD ;ALL BELOW (AFTER JOBREL) ARE FOR DPY CALLS ELSEWHERE.
EXTERNAL JOBREL,DPYSET,ALINE,DPYOUT,DDCLR,AIVECT,TYPLOC,RVECT
A ← 1 ;WORK
B ← 2 ;WORK
RET ← 3 ;RETURN ACCUMULATOR
T1 ← 4 ; TEMP FOR ADSMAP (JAM)
BUFCNT ←5 ; BUFFER COUNTER FOR REPLAY FEATURE
REP ← 6; ;FOR REPLAY USETI
;;BUFSIZ ←=20224 ;****** DOUBLE THIS FOR 4-CHANNEL SOUND!!!!!
BUFSIZ ←4400*3 ;OPTIMIZED FOR 3330 DSK. (←4400*3 IN SYS VERSION)
↓DSKCHN ←4 ;DISK CHANNEL FOR INPUT
↓ADCHN ←3 ;D-A CHANNEL FOR OUTPUT
OPDEF READCH [51B8]
OPDEF MESSAGE[51B8!3B12]
;FUNCTION NOTDD(K) -- IF NEG. IT'S NOT A DATADISC -- FOR 'SEE'
NOTDD: 0
MOVNI 2,1
GETLIN 2
SETZ ;0=IT IS A DD
TLNN 2,20000
SETO ;-1=NOT DD
JRA 16,1(16)
PLAY: 0
BEG: ;CALLI 0,0 ;RESET I/O DEVICES
OPEN DSKCHN,[17 ;MODE
'DSK ' ;DEVICE NAME
0] ;NO BUFFER HEADERS
HALT BEG ;RESTART IF DEVICE IS UNAVAILABLE
MOVE 6,['TEST ']
MOVE 7,['SND ']
SETZM DIR+3 ;FOR RESTART
MOVE @1(16) ; GET SRATE
IDIVI =12800 ;NOW IT IS 0,1,2,4,8 OR 16.
CAIN 4
MOVEI 3 ;4 GOES TO 3
CAIN =8
MOVEI 4 ;8 GOES TO 4
CAIN =16
MOVEI 5 ;16 GOES TO 5
MOVEM SAVSPD ;INIT SAVSPD
MOVEM 6,DIR
MOVEM 7,DIR+1
;FIND OUT NUMBER OF CHANNELS AND THE SPEED.
MOVE A,@(16) ; GET NCHNS FROM MAIN PROG.
SKIPG A ;*****ALL THIS IS FOUND IN HEADER ANYWAY!!!
MOVEI A,1 ;MAKE NCHNS=1 IF IT WASN'T
DPB A,[POINT 2,DACPAR,35]
SETZM REP ; FOR SPEED CHNGS WITH HEADER
SPD: MESSAGE [ASCIZ/
SPEED?, <CR>, OR "X" /]
READCH A
SETOM REPT#
CAIE A,"X"
JRST .+3
MESSAGE [ASCIZ/ ****PLEASE DELETE TEST.SND**** /]
JRA 16,2(16)
CAIN A,15 ; IS IT A CRLF???
JRST CRLF ; YES
CAIN A,"R" ;"Rn" REPEATS PLAY n TIMES
JRST REP3
CAIG A,"5" ;IS IT 1 - 5?
JRST SPD2 ;YES
SKIPN DIR+3 ;IS THIS THE 1ST TIME THRU?
JRST SPD ;YES, SO WE NEED A GOOD NUM.
JRST PLA2 ;ELSE GO PLAY SAME AS LAST TIME
REP3: READCH A ;WHAT FOLLOWS R?
SUBI A,"0" ;FIX IT UP
CAILE A,=9 ;IF(A.GT.9)A=1 TRAPS "G" ETC.
MOVEI A,1
MOVNM A,REPT
MOVE A,SAVSPD ;GET BACK SPEED.
JRST SPD3
CRLF: READCH A ;GET THE LINEFEED
MOVE A,SAVSPD
JRST SPD3
SPD2: SUBI A,"0"
MOVEM A,SAVSPD# ;SAVE AC A.
SPD3: DPB A,[POINT 3,DACPAR,26]
PLA2: SETZM DIR+3
LOOKUP DSKCHN,DIR
SKIPA ;CAN'T FIND TEST.SND
JRST XOPEN ;FOUND IT
MUS: JRST [MESSAGE[ASCIZ/
*** TEST.SND NOT FOUND/]
CALLI 12]
;EXIT IF FILE IS MISSING
XOPEN: OPEN ADCHN,[1B27+117 ;MODE
'DAC ' ;DEVICE NAME
0] ;NO BUFFER HEADERS
SKIPA
JRST SPWAR-1 ;WE GOT THE DAC, NOW TRY FOR THE XGP!
MESSAGE [ASCIZ/
WAITING FOR DAC------ /]
OPEN ADCHN,[1B26+117 ;WE'LL WAIT FOR IT
'DAC '
0]
0 ;NO FAILURE POSSIBLE?????
MTAPE ADCHN,DACPAR
SPWAR: HRRZ A,JOBREL
HRRZM A,OLDREL#
HRRZM A,BUF1
HRRZI A,1(A)
HRRM A,HEADER
ADDI A,BUFSIZ
HRRZM A,BUF2
ADDI A,BUFSIZ+1
HRRZM A,BUF3
ADDI A,BUFSIZ+2
CORE A,
JRST [OUTSTR[ASCIZ/
CAN'T GET CORE!
/]↔ JRA 16,2(16)]
LOCK A, ;SPWAR:
DOIT: SETO BUFCNT, ;KEEP TRACK OF WHICH BUFFER, FOR REPLAY
SKIPE REP ;SKIP FIRST TIME
JRST REPLA ;OMIT HEADER ON REPLAYS
MOVEI REP,1 ;FOR REPLAY
INPUT DSKCHN,HEADER
HRRZ A,HEADER
HRRZ B,1(A)
CAIE B,525252 ; LOOKS FOR MAGIC NUMBER.
JRST REPLA
;; MESSAGE [ASCIZ/ ;****ALWAYS HEADER NOW 3/77
;;---- THERE'S A HEADER ---- /]
HLRZ B,2(A) ;GET SPEED FROM LEFT HALF OF WD 2
DPB B,[POINT 3,DACPAR,26] ;PUT AWAY THE SPEED
HRRZ B,3(A) ;GET BITS FROM RIGHT HALF OF WD 3
DPB B,[POINT 2,DACPAR,29] ;12 OR 18 BIT
MOVE B,4(A) ;GET NCHNS FROM WD 4
DPB B,[POINT 2,DACPAR,35]
MTAPE ADCHN,DACPAR ;NOW USE ALL THE STUFF FROM THE HEADER
MOVEI REP,2 ;FOR REPLAY
SKIPA
REPLA: USETI DSKCHN,(REP) ;REP=1 IF NO HEADER, =2 WITH HEADER.
LNTH: movs a,DIR+3 ;get length of file.
CAIN REP,2 ;WAS THERE A HEADER?
ADDI A,200 ;YES, SUBTRACT IT FROM WDCNT.
movnm a,nwd
;-----------------------------------------------------
;BEGIN MAIN BODY OF PROGRAM
MOVE T1,[647003,,0]
ADSMAP T1, ; SET AUDIO SWITCH TEMPORARILY TO DAC (JAM 7/24/75)
; THE OPTIONS WE ASKED FOR ARE TEMPORARY, WAIT FOR
; PAGE TO FINISH, DON'T INTERRUPT WITH MORE PAGES,
; DELAY BEEPS TO END OF XFR.
OUTSTR [ASCIZ /
TO DAC . . ./]
JUMPE BUFCNT,LOOP2 ;FOR REPLAYS
JUMPG BUFCNT,LOOP3
LOOP: JSP RET,SUB ;ROUTINE TO READ AND WRITE
BUF1: 0
AOS BUFCNT
JUMPLE B,DONE ;DONE
LOOP2: JSP RET,SUB
BUF2: 0
AOS BUFCNT
JUMPLE B,DONE
LOOP3: JSP RET,SUB ;CALL IT AGAIN
BUF3: 0
SETO BUFCNT, ;RE-INIT BUFFER COUNTER, FOR REPLAYS
JUMPG B,LOOP ;GO BACK FOR MORE IF B>0
DONE: AOSGE REPT ;UPDATE REPT
JRST REPLA ;WE PLAY AGAIN IF REPT .LT.0
;;;DONE: AOS A,REPT ;UPDATE REPT
;;; JUMPGE A,.+3 ;REPEAT IF .LE.0
;;; USETI DSKCHN,1 ;GET BACK TO HEAD OF FILE.
;;; JRST LNTH
close dskchn, ;END OF PROGRAM.
releas adchn,
OUTSTR [ASCIZ / DONE!
/]
SETO T1,
ADSMAP T1, ; RESET AUDIO SWITCH CONNECTION TO PERMANENT (JAM 7/24/75)
UNLOCK
HRRZ A,OLDREL
CORE A,
JRST [OUTSTR[ASCIZ/DONK??!!/]↔JRA 16,2(16)]
jrst SPD
;SUBROUTINE TO SET UP IOWD AND READ AND WRITE.
; 1(RET) WILL BE THE RETURN
; 0(RET) WILL BE THE ADDRESS OF THE BUFFER TO BE
; PUT IN THE RIGHT HALF OF THE IOWD.
; A WILL BE A WORK REGISTER
; B WILL BE TESTED ON THE OUTSIDE.
SUB: MOVNI A,BUFSIZ ;PICK UP AND COMPLEMENT BUFSIZ
ADDB A,NWD ;A←NWD-BUFSIZ
;NWD←NWD-BUFSIZ
MOVE B,A ;SAVE B TO BE TESTED FOR LAST
;TIME.
JUMPL A,LAST ;SET UP FOR LAST TIME.
MOVEI A,0
;THE IOWD LOOKS LIKE:
; [-BUFSIZ / BUFI-1]
LAST: ADDI A,BUFSIZ
MOVNS A ;COMPLEMENT A
HRL A,0(RET) ;PICK UP BUFI AND MOVE IT
;TO THE LEFT SIDE OF A.
MOVSM A,INLIST ;SWAP A AND MOVE IT.
MOVSM A,OUTWC ;SAME FOR OUTPUT.
INPUT DSKCHN,INLIST ;READ A RECORD.
OUTPUT ADCHN,OUTWC ;WRITE THE RECORD.
JRST 1(RET) ;RETURN
;---------------------------------------------------------
; STORAGE:
NWD: 0 ;FOR NUMBER OF WORDS OF INPUT.
;↓BUF1: BLOCK BUFSIZ+1 ;BUFFER 1
;BUF2: BLOCK BUFSIZ+1 ;BUFFER 2
;BUF3: BLOCK BUFSIZ+1 ;BUFFER 3
DIR: 0 ;NAME
0 ;EXTENSION
0 ;INFORMATION ON FILE
0 ;PROJECT PROG#
CLIST: IOWD 1,NWD ;FOR THE FIRST RECORD
0
INLIST: 0 ;WILL CONTAIN AN IOWD
0
HEADER: IOWD =128,BUF1
0
OUTWC: 0 ;WILL CONTAIN AN IOWD FOR D-A
OUTBIT: 4000 ;BITS FOR D-A
BLOCK 2
DACPAR: 1001 ;SPEED 0=6.4K, 1=12.8, 2=25.6, 3=51.2, 4=102.4, 5=
0
0
A←1
B←2
D←3
ichn←adchn
END